netflix_data <- read_csv("netflix-rotten-tomatoes-metacritic-imdb.csv")
-- Column specification -----------------------------------------------------------------------------------------------
cols(
.default = col_character(),
`Hidden Gem Score` = col_double(),
`IMDb Score` = col_double(),
`Rotten Tomatoes Score` = col_double(),
`Metacritic Score` = col_double(),
`Awards Received` = col_double(),
`Awards Nominated For` = col_double(),
`Netflix Release Date` = col_date(format = ""),
`IMDb Votes` = col_double()
)
i Use `spec()` for the full column specifications.
netflix_data_cleaned <- read_csv("netflix-rotten-tomatoes-metacritic-imdb.csv")
-- Column specification -----------------------------------------------------------------------------------------------
cols(
.default = col_character(),
`Hidden Gem Score` = col_double(),
`IMDb Score` = col_double(),
`Rotten Tomatoes Score` = col_double(),
`Metacritic Score` = col_double(),
`Awards Received` = col_double(),
`Awards Nominated For` = col_double(),
`Netflix Release Date` = col_date(format = ""),
`IMDb Votes` = col_double()
)
i Use `spec()` for the full column specifications.
netflix_data$Image[5]
[1] "https://occ-0-4039-1500.1.nflxso.net/dnm/api/v6/evlCitJPPCVCry0BZlEFb5-QjKc/AAAABb72YCHDSHzrB8i5_iG56UFm-qV2bslRyMHIqZ4tmlIpeVtMsqAyUem6JAxXtV4Ec9jlA4EpTdf5tNX2ivyLUwmPy4d3xowFdJE63MPXbWu8kAnc-j9qhAZrmMI.jpg?r=fad"
names(netflix_genre)
[1] "netflix_data$Genre"
netflix_data %>%
filter(grepl(head(netflix_actors, n = 1), Actors))
fig
No scattermapbox mode specifed:
Setting the mode to markers
Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
No scattermapbox mode specifed:
Setting the mode to markers
Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
airbnb_data %>%
skimr::skim()
-- Data Summary ------------------------
Values
Name Piped data
Number of rows 20454
Number of columns 89
_______________________
Column type frequency:
character 49
logical 4
numeric 36
________________________
Group variables None
-- Variable type: character ------------------------------------------------------------------------------------------
# A tibble: 49 x 8
skim_variable n_missing complete_rate min max empty n_unique whitespace
* <chr> <int> <dbl> <int> <int> <int> <int> <int>
1 Listing.Url 0 1 33 37 0 20454 0
2 Last.Scraped 0 1 10 10 0 1 0
3 Name 0 1 0 109 97 19702 0
4 Summary 0 1 0 1000 959 19081 0
5 Space 0 1 0 1000 7613 12579 0
6 Description 0 1 0 1000 10 20212 0
7 Experiences.Offered 0 1 4 4 0 1 0
8 Neighborhood.Overview 0 1 0 1000 10642 9270 0
9 Notes 0 1 0 1000 14495 5540 0
10 Transit 0 1 0 1000 8718 11113 0
11 Access 0 1 0 1000 10919 8895 0
12 Interaction 0 1 0 1000 11216 8704 0
13 House.Rules 0 1 0 1000 9468 10271 0
14 Thumbnail.Url 0 1 0 93 2154 18300 0
15 Medium.Url 0 1 0 94 2154 18300 0
16 Picture.Url 0 1 0 110 64 20390 0
17 XL.Picture.Url 0 1 0 95 2154 18300 0
18 Host.URL 0 1 38 43 0 17717 0
19 Host.Name 0 1 0 42 18 5590 0
20 Host.Since 0 1 0 10 18 2419 0
21 Host.Location 0 1 0 199 130 851 0
22 Host.About 0 1 0 5078 10411 8146 0
23 Host.Response.Time 0 1 0 18 6712 5 0
24 Host.Thumbnail.Url 0 1 0 102 18 17639 0
25 Host.Picture.Url 0 1 0 105 18 17639 0
26 Host.Neighbourhood 0 1 0 62 5032 183 0
27 Host.Verifications 0 1 0 113 10 243 0
28 Street 0 1 15 51 0 628 0
29 Neighbourhood 0 1 0 20 5613 94 0
30 Neighbourhood.Cleansed 0 1 4 41 0 137 0
31 Neighbourhood.Group.Cleansed 0 1 5 24 0 12 0
32 City 0 1 6 6 0 1 0
33 State 0 1 0 21 42 20 0
34 Zipcode 0 1 0 12 770 214 0
35 Market 0 1 0 21 66 9 0
36 Smart.Location 0 1 15 16 0 2 0
37 Country.Code 0 1 2 2 0 1 0
38 Country 0 1 7 7 0 1 0
39 Property.Type 0 1 4 18 0 28 0
40 Room.Type 0 1 11 15 0 3 0
41 Bed.Type 0 1 5 13 0 5 0
42 Amenities 0 1 0 873 124 15956 0
43 Calendar.Updated 0 1 5 13 0 56 0
44 Calendar.last.Scraped 0 1 10 10 0 2 0
45 First.Review 0 1 0 10 4375 1806 0
46 Last.Review 0 1 0 10 4375 889 0
47 Cancellation.Policy 0 1 6 15 0 4 0
48 Geolocation 0 1 22 27 0 20454 0
49 Features 0 1 0 159 26 49 0
-- Variable type: logical --------------------------------------------------------------------------------------------
# A tibble: 4 x 5
skim_variable n_missing complete_rate mean count
* <chr> <int> <dbl> <dbl> <chr>
1 Host.Acceptance.Rate 20454 0 NaN ": "
2 Has.Availability 20454 0 NaN ": "
3 License 20454 0 NaN ": "
4 Jurisdiction.Names 20454 0 NaN ": "
-- Variable type: numeric --------------------------------------------------------------------------------------------
# A tibble: 36 x 11
skim_variable n_missing complete_rate mean sd p0 p25 p50 p75
* <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 ID 0 1 1.01e 7 5578845. 1.97e+ 3 5.56e+ 6 1.02e+ 7 1.52e 7
2 Scrape.ID 0 1 2.02e13 0 2.02e+13 2.02e+13 2.02e+13 2.02e13
3 Host.ID 0 1 3.37e 7 33237387. 2.16e+ 3 7.31e+ 6 2.22e+ 7 4.86e 7
4 Host.Response.Rate 6712 0.672 8.94e 1 22.3 0 9 e+ 1 1 e+ 2 1 e 2
5 Host.Listings.Count 18 0.999 1.87e 0 3.66 0 1 e+ 0 1 e+ 0 2 e 0
6 Host.Total.Listings.Count 18 0.999 1.87e 0 3.66 0 1 e+ 0 1 e+ 0 2 e 0
7 Latitude 0 1 5.25e 1 0.0305 5.23e+ 1 5.25e+ 1 5.25e+ 1 5.25e 1
8 Longitude 0 1 1.34e 1 0.0554 1.31e+ 1 1.34e+ 1 1.34e+ 1 1.34e 1
9 Accommodates 0 1 2.64e 0 1.50 1 e+ 0 2 e+ 0 2 e+ 0 3 e 0
10 Bathrooms 64 0.997 1.09e 0 0.327 0 1 e+ 0 1 e+ 0 1 e 0
11 Bedrooms 19 0.999 1.17e 0 0.623 0 1 e+ 0 1 e+ 0 1 e 0
12 Beds 30 0.999 1.61e 0 1.17 1 e+ 0 1 e+ 0 1 e+ 0 2 e 0
13 Square.Feet 19836 0.0302 4.44e 2 488. 0 0 3.55e+ 2 7.08e 2
14 Price 8 1.00 5.72e 1 46.3 0 3 e+ 1 4.5 e+ 1 6.9 e 1
15 Weekly.Price 15296 0.252 3.30e 2 161. 6.5 e+ 1 2.02e+ 2 3 e+ 2 4 e 2
16 Monthly.Price 16800 0.179 1.12e 3 771. 2.65e+ 2 6.88e+ 2 9.5 e+ 2 1.3 e 3
17 Security.Deposit 13112 0.359 2.29e 2 152. 0 1 e+ 2 2 e+ 2 3 e 2
18 Cleaning.Fee 8565 0.581 2.74e 1 19.3 0 1.5 e+ 1 2.5 e+ 1 3.5 e 1
19 Guests.Included 0 1 1.32e 0 0.794 1 e+ 0 1 e+ 0 1 e+ 0 1 e 0
20 Extra.People 0 1 7.76e 0 10.1 0 0 5 e+ 0 1.5 e 1
21 Minimum.Nights 0 1 4.79e 0 37.9 1 e+ 0 1 e+ 0 2 e+ 0 3 e 0
22 Maximum.Nights 0 1 2.53e 5 19289789. 1 e+ 0 3 e+ 1 1.12e+ 3 1.12e 3
23 Availability.30 0 1 5.48e 0 8.43 0 0 0 8 e 0
24 Availability.60 0 1 1.30e 1 18.6 0 0 1 e+ 0 2.2 e 1
25 Availability.90 0 1 2.21e 1 29.3 0 0 5 e+ 0 3.9 e 1
26 Availability.365 0 1 1.04e 2 128. 0 0 3.3 e+ 1 2.08e 2
27 Number.of.Reviews 0 1 1.29e 1 26.8 0 1 e+ 0 3 e+ 0 1.2 e 1
28 Review.Scores.Rating 4658 0.772 9.34e 1 8.06 2 e+ 1 9 e+ 1 9.5 e+ 1 1 e 2
29 Review.Scores.Accuracy 4707 0.770 9.59e 0 0.798 2 e+ 0 9 e+ 0 1 e+ 1 1 e 1
30 Review.Scores.Cleanliness 4699 0.770 9.29e 0 1.05 2 e+ 0 9 e+ 0 1 e+ 1 1 e 1
31 Review.Scores.Checkin 4716 0.769 9.66e 0 0.747 2 e+ 0 1 e+ 1 1 e+ 1 1 e 1
32 Review.Scores.Communication 4701 0.770 9.68e 0 0.738 2 e+ 0 1 e+ 1 1 e+ 1 1 e 1
33 Review.Scores.Location 4714 0.770 9.42e 0 0.810 2 e+ 0 9 e+ 0 1 e+ 1 1 e 1
34 Review.Scores.Value 4723 0.769 9.35e 0 0.870 2 e+ 0 9 e+ 0 1 e+ 1 1 e 1
35 Calculated.host.listings.count 0 1 1.70e 0 2.85 1 e+ 0 1 e+ 0 1 e+ 0 1 e 0
36 Reviews.per.Month 4375 0.786 1.07e 0 1.30 1 e- 2 2.2 e- 1 5.6 e- 1 1.38e 0
p100 hist
* <dbl> <chr>
1 1.86e 7 ▅▅▆▆▇
2 2.02e13 ▁▁▇▁▁
3 1.29e 8 ▇▃▂▁▁
4 1 e 2 ▁▁▁▁▇
5 1.8 e 2 ▇▁▁▁▁
6 1.8 e 2 ▇▁▁▁▁
7 5.27e 1 ▁▁▇▃▁
8 1.37e 1 ▁▂▇▁▁
9 1.6 e 1 ▇▁▁▁▁
10 8 e 0 ▇▁▁▁▁
11 1 e 1 ▇▁▁▁▁
12 1.6 e 1 ▇▁▁▁▁
13 4.64e 3 ▇▁▁▁▁
14 9.95e 2 ▇▁▁▁▁
15 9.99e 2 ▇▇▃▁▁
16 1.39e 4 ▇▁▁▁▁
17 9.99e 2 ▇▇▂▁▁
18 3 e 2 ▇▁▁▁▁
19 1.5 e 1 ▇▁▁▁▁
20 2 e 2 ▇▁▁▁▁
21 5 e 3 ▇▁▁▁▁
22 2.15e 9 ▇▁▁▁▁
23 3 e 1 ▇▁▁▁▁
24 6 e 1 ▇▁▁▁▁
25 9 e 1 ▇▂▁▁▂
26 3.65e 2 ▇▂▁▁▂
27 3.6 e 2 ▇▁▁▁▁
28 1 e 2 ▁▁▁▁▇
29 1 e 1 ▁▁▁▁▇
30 1 e 1 ▁▁▁▁▇
31 1 e 1 ▁▁▁▁▇
32 1 e 1 ▁▁▁▁▇
33 1 e 1 ▁▁▁▁▇
34 1 e 1 ▁▁▁▁▇
35 3.4 e 1 ▇▁▁▁▁
36 1.06e 1 ▇▁▁▁▁
airbnb_data %>%
filter(Price > 10) %>%
plot_mapbox() %>%
layout(mapbox = list(style = "open-street-map", center = list(lon = 13.3783, lat = 52.5163), zoom = 10)) %>%
add_markers(x = ~Longitude, y = ~Latitude,
text = ~str_c(Name, ", EUR ", Price, sep = ""), hoverinfo = "text",
size = 20, color = ~Neighbourhood.Group.Cleansed) %>%
highlight(on = "plotly_selected")
n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors
n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors
n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors
n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors
berlin <- fromJSON(file = "airbnb-listings.geojson")
Fehler in fromJSON(file = "airbnb-listings.geojson") :
konnte Funktion "fromJSON" nicht finden
grouped_airbnb_host <- airbnb_data %>%
group_by(Host.ID) %>%
summarize(
Number.of.Listings = n(),
Mean.Price = mean(Price, na.rm = TRUE),
Mean.Review.Scores.Rating = mean(Review.Scores.Rating, na.rm = TRUE),
Mean.Review.Scores.Accuracy = mean(Review.Scores.Accuracy, na.rm = TRUE),
Mean.Review.Scores.Cleanliness = mean(Review.Scores.Cleanliness, na.rm = TRUE),
Mean.Review.Scores.Checkin = mean(Review.Scores.Checkin, na.rm = TRUE),
Mean.Review.Scores.Communication = mean(Review.Scores.Communication, na.rm = TRUE),
Mean.Review.Scores.Location = mean(Review.Scores.Location, na.rm = TRUE),
Mean.Review.Scores.Value = mean(Review.Scores.Value, na.rm = TRUE),
Mean.Number.of.Reviews = mean(Number.of.Reviews, na.rm = TRUE),
Host.Name = Host.Name,
Host.Since = Host.Since,
Host.Response.Rate = Host.Response.Rate,
Host.Response.Time = Host.Response.Time,
Host.Acceptance.Rate = Host.Acceptance.Rate
)
`summarise()` has grouped output by 'Host.ID'. You can override using the `.groups` argument.
library(viridis)
Lade n昼㸶tiges Paket: viridisLite
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KYGBge3J9DQpuZXRmbGl4X2RhdGEgPC0gcmVhZF9jc3YoIm5ldGZsaXgtcm90dGVuLXRvbWF0b2VzLW1ldGFjcml0aWMtaW1kYi5jc3YiKQ0KYGBgDQpgYGB7cn0NCm5ldGZsaXhfZGF0YSA8LSBuZXRmbGl4X2RhdGEgJT4lDQogIHJlbmFtZSgNCiAgICBUYWcgPSBUYWdzLA0KICAgIFNlcmllc19vcl9Nb3ZpZSA9IGBTZXJpZXMgb3IgTW92aWVgLA0KICAgIEhpZGRlbl9HZW1fU2NvcmUgPSBgSGlkZGVuIEdlbSBTY29yZWAsDQogICAgQ291bnRyeV9BdmFpbGFiaWxpdHkgPSBgQ291bnRyeSBBdmFpbGFiaWxpdHlgLA0KICAgIFZpZXdfUmF0aW5nID0gYFZpZXcgUmF0aW5nYCwNCiAgICBJTURiX1Njb3JlID0gYElNRGIgU2NvcmVgLA0KICAgIFJvdHRlbl9Ub21hdG9lc19TY29yZSA9IGBSb3R0ZW4gVG9tYXRvZXMgU2NvcmVgLA0KICAgIE1ldGFjcml0aWNfU2NvcmUgPSBgTWV0YWNyaXRpYyBTY29yZWAsDQogICAgQXdhcmRzX1JlY2VpdmVkID0gYEF3YXJkcyBSZWNlaXZlZGAsDQogICAgQXdhcmRzX05vbWluYXRlZCA9IGBBd2FyZHMgTm9taW5hdGVkIEZvcmAsDQogICAgUmVsZWFzZV9EYXRlID0gYFJlbGVhc2UgRGF0ZWAsDQogICAgTmV0ZmxpeF9SZWxlYXNlX0RhdGUgPSBgTmV0ZmxpeCBSZWxlYXNlIERhdGVgLA0KICAgIFByb2R1Y3Rpb25fSG91c2UgPSBgUHJvZHVjdGlvbiBIb3VzZWAsDQogICAgTmV0ZmxpeF9MaW5rID0gYE5ldGZsaXggTGlua2AsDQogICAgSU1EYl9Wb3RlcyA9IGBJTURiIFZvdGVzYCwNCiAgICBUTURiX1RyYWlsZXIgPSBgVE1EYiBUcmFpbGVyYCwNCiAgICBUcmFpbGVyX1NpdGUgPSBgVHJhaWxlciBTaXRlYA0KICApDQpgYGANCg0KDQpgYGB7cn0NCm5ldGZsaXhfZGF0YV9jbGVhbmVkIDwtIHJlYWRfY3N2KCJuZXRmbGl4LXJvdHRlbi10b21hdG9lcy1tZXRhY3JpdGljLWltZGIuY3N2IikNCm5ldGZsaXhfZGF0YV9jbGVhbmVkJEdlbnJlIDwtIHN0cl9zcGxpdChuZXRmbGl4X2RhdGEkR2VucmUsICIsICIpDQpuZXRmbGl4X2RhdGFfY2xlYW5lZCRUYWdzIDwtIHN0cl9zcGxpdChuZXRmbGl4X2RhdGEkVGFncywgIiwiKQ0KbmV0ZmxpeF9kYXRhX2NsZWFuZWQkTGFuZ3VhZ2VzIDwtIHN0cl9zcGxpdChuZXRmbGl4X2RhdGEkTGFuZ3VhZ2VzLCAiLCAiKQ0KbmV0ZmxpeF9kYXRhX2NsZWFuZWQkYENvdW50cnkgQXZhaWxhYmlsaXR5YCA8LSBzdHJfc3BsaXQobmV0ZmxpeF9kYXRhJGBDb3VudHJ5IEF2YWlsYWJpbGl0eWAsICIsIikNCm5ldGZsaXhfZGF0YV9jbGVhbmVkJERpcmVjdG9yIDwtIHN0cl9zcGxpdChuZXRmbGl4X2RhdGEkRGlyZWN0b3IsICIsICIpDQpuZXRmbGl4X2RhdGFfY2xlYW5lZCRXcml0ZXIgPC0gc3RyX3NwbGl0KG5ldGZsaXhfZGF0YSRXcml0ZXIsICIsICIpDQpuZXRmbGl4X2RhdGFfY2xlYW5lZCRBY3RvcnMgPC0gc3RyX3NwbGl0KG5ldGZsaXhfZGF0YSRBY3RvcnMsICIsICIpDQpuZXRmbGl4X2RhdGFfY2xlYW5lZCRgUHJvZHVjdGlvbiBIb3VzZWAgPC0gc3RyX3NwbGl0KG5ldGZsaXhfZGF0YSRgUHJvZHVjdGlvbiBIb3VzZWAsICIsICIpDQpgYGANCg0KYGBge3J9DQpuZXRmbGl4X2RhdGFfY2xlYW5lZCAlPiUNCiAgZmlsdGVyKCJTaG9ydCIgJWluJSBHZW5yZSkNCmBgYA0KYGBge3J9DQpuZXRmbGl4X2RhdGEkSW1hZ2VbNV0NCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXIpDQpuZXRmbGl4X2dlbnJlIDwtIHVuaXF1ZShzZXBhcmF0ZV9yb3dzKGFzLmRhdGEuZnJhbWUobmV0ZmxpeF9kYXRhJEdlbnJlKSwgIm5ldGZsaXhfZGF0YSRHZW5yZSIsIHNlcCA9ICIsICIsIGNvbnZlcnQgPSBUUlVFKSkNCm5ldGZsaXhfdGFncyA8LSB1bmlxdWUoc2VwYXJhdGVfcm93cyhhcy5kYXRhLmZyYW1lKG5ldGZsaXhfZGF0YSRUYWcpLCAibmV0ZmxpeF9kYXRhJFRhZyIsIHNlcCA9ICIsIiwgY29udmVydCA9IFRSVUUpKQ0KbmV0ZmxpeF9sYW5ndWFnZXMgPC0gdW5pcXVlKHNlcGFyYXRlX3Jvd3MoYXMuZGF0YS5mcmFtZShuZXRmbGl4X2RhdGEkTGFuZ3VhZ2VzKSwgIm5ldGZsaXhfZGF0YSRMYW5ndWFnZXMiLCBzZXAgPSAiLCAiLCBjb252ZXJ0ID0gVFJVRSkpDQpuZXRmbGl4X2NvdW50cnlfYXZhaWxhYmlsaXR5IDwtIHVuaXF1ZShzZXBhcmF0ZV9yb3dzKGFzLmRhdGEuZnJhbWUobmV0ZmxpeF9kYXRhJENvdW50cnlfQXZhaWxhYmlsaXR5KSwgIm5ldGZsaXhfZGF0YSRDb3VudHJ5X0F2YWlsYWJpbGl0eSIsIHNlcCA9ICIsIiwgY29udmVydCA9IFRSVUUpKQ0KbmV0ZmxpeF9kaXJlY3RvciA8LSB1bmlxdWUoc2VwYXJhdGVfcm93cyhhcy5kYXRhLmZyYW1lKG5ldGZsaXhfZGF0YSREaXJlY3RvciksICJuZXRmbGl4X2RhdGEkRGlyZWN0b3IiLCBzZXAgPSAiLCAiLCBjb252ZXJ0ID0gVFJVRSkpDQpuZXRmbGl4X3dyaXRlciA8LSB1bmlxdWUoc2VwYXJhdGVfcm93cyhhcy5kYXRhLmZyYW1lKG5ldGZsaXhfZGF0YSRXcml0ZXIpLCAibmV0ZmxpeF9kYXRhJFdyaXRlciIsIHNlcCA9ICIsICIsIGNvbnZlcnQgPSBUUlVFKSkNCm5ldGZsaXhfYWN0b3JzIDwtIHVuaXF1ZShzZXBhcmF0ZV9yb3dzKGFzLmRhdGEuZnJhbWUobmV0ZmxpeF9kYXRhJEFjdG9ycyksICJuZXRmbGl4X2RhdGEkQWN0b3JzIiwgc2VwID0gIiwgIiwgY29udmVydCA9IFRSVUUpKQ0KbmV0ZmxpeF9wcm9kdWN0aW9uX2hvdXNlIDwtIHVuaXF1ZShzZXBhcmF0ZV9yb3dzKGFzLmRhdGEuZnJhbWUobmV0ZmxpeF9kYXRhJFByb2R1Y3Rpb25fSG91c2UpLCAibmV0ZmxpeF9kYXRhJFByb2R1Y3Rpb25fSG91c2UiLCBzZXAgPSAiLCAiLCBjb252ZXJ0ID0gVFJVRSkpDQpuYW1lcyhuZXRmbGl4X2dlbnJlKSA8LSAiR2VucmUiDQpuYW1lcyhuZXRmbGl4X3RhZ3MpIDwtICJUYWciDQpuYW1lcyhuZXRmbGl4X2xhbmd1YWdlcykgPC0gIkxhbmd1YWdlIg0KbmFtZXMobmV0ZmxpeF9jb3VudHJ5X2F2YWlsYWJpbGl0eSkgPC0gIkNvdW50cnkiDQpuYW1lcyhuZXRmbGl4X2RpcmVjdG9yKSA8LSAiRGlyZWN0b3IiDQpuYW1lcyhuZXRmbGl4X3dyaXRlcikgPC0gIldyaXRlciINCm5hbWVzKG5ldGZsaXhfYWN0b3JzKSA8LSAiQWN0b3IiDQpuYW1lcyhuZXRmbGl4X3Byb2R1Y3Rpb25faG91c2UpIDwtICJQcm9kdWN0aW9uX0hvdXNlIg0KYGBgDQoNCmBgYHtyfQ0KbmV0ZmxpeF9kYXRhICU+JQ0KICBmaWx0ZXIoZ3JlcGwoaGVhZChuZXRmbGl4X2FjdG9ycywgbiA9IDEpLCBBY3RvcnMpKQ0KYGBgDQoNCmBgYHtyfQ0KYWlyYm5iX2RhdGEgPC0gcmVhZC5jc3YoImFpcmJuYi1saXN0aW5ncy5jc3YiLCBzZXAgPSAnOycsIGVuY29kaW5nID0gIlVURi04IikNCg0KbGlicmFyeShwbG90bHkpDQpmaWcgPC0gYWlyYm5iX2RhdGENCmZpZyA8LSBmaWcgJT4lDQogIHBsb3RfbHkoDQogICAgbGF0ID0gfkxhdGl0dWRlLA0KICAgIGxvbiA9IH5Mb25naXR1ZGUsDQogICAgdHlwZSA9ICdzY2F0dGVybWFwYm94Jw0KICApDQpmaWcgPC0gZmlnICU+JQ0KICBsYXlvdXQoDQogICAgbWFwYm94ID0gbGlzdCgNCiAgICAgIHN0eWxlID0gJ29wZW4tc3RyZWV0LW1hcCcsDQogICAgICB6b29tID0gNA0KICAgICkNCiAgKQ0KZmlnDQpgYGANCg0KDQpgYGB7cn0NCmFpcmJuYl9kYXRhJExpc3RpbmcuVXJsWzFdDQphaXJibmJfZGF0YSAlPiUNCiAgc2VsZWN0KCJOYW1lIiwgIkhvc3QuTmFtZSIsICJOZWlnaGJvdXJob29kLkNsZWFuc2VkIikNCmBgYA0KYGBge3J9DQphaXJibmJfZGF0YSAlPiUNCiAgc2VsZWN0KCJIb3N0LklEIjoiSG9zdC5WZXJpZmljYXRpb25zIikgJT4lDQogIGZpbHRlcihIb3N0Lk5hbWUgPT0gIk1hcmlhIikgJT4lDQogIGFycmFuZ2UoSG9zdC5SZXNwb25zZS5SYXRlKQ0KYGBgDQpgYGB7cn0NCmFpcmJuYl9kYXRhICU+JQ0KICBncm91cF9ieShOZWlnaGJvdXJob29kLkNsZWFuc2VkKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgUHJpY2UgPSBtZWFuKFByaWNlKSwNCiAgICBSZXZpZXcuU2NvcmVzLlJhdGluZyA9IG1lYW4oUmV2aWV3LlNjb3Jlcy5SYXRpbmcpDQogICkNCmBgYA0KYGBge3J9DQphaXJibmJfZGF0YSAlPiUNCiAgZ3JvdXBfYnkoTmVpZ2hib3VyaG9vZC5Hcm91cC5DbGVhbnNlZCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICAjbiA9IG4oKSwNCiAgICAjUHJpY2UgPSBtZWFuKFByaWNlKSwNCiAgICAjUmV2aWV3LlNjb3Jlcy5SYXRpbmcgPSBtZWFuKFJldmlldy5TY29yZXMuUmF0aW5nKQ0KICAgIGZ1bnMobWVhbighaXMubmEoLikpKQ0KICApDQoNCmFpcmJuYl9kYXRhICU+JQ0KICBncm91cF9ieShOZWlnaGJvdXJob29kLkdyb3VwLkNsZWFuc2VkKSAlPiUNCiAgc3VtbWFyaXNlKGFjcm9zcyhldmVyeXRoaW5nKCksIGxpc3QobWVhbiA9IG1lYW4pKSkNCg0KYWlyYm5iX2RhdGEgJT4lDQogIGZpbHRlcihhY3Jvc3MoYyhCZWRzLCBDb3VudHJ5KSwgfiAhaXMubmEoLikpKQ0KYGBgDQpgYGB7cn0NCmFpcmJuYl9kYXRhICU+JQ0KICBza2ltcjo6c2tpbSgpDQpgYGANCg0KYGBge3J9DQphaXJibmJfZGF0YSAlPiUNCiAgZmlsdGVyKFByaWNlID4gMjAwKSAlPiUNCiAgcGxvdF9tYXBib3goKSAlPiUNCiAgbGF5b3V0KG1hcGJveCA9IGxpc3Qoc3R5bGUgPSAib3Blbi1zdHJlZXQtbWFwIiwgY2VudGVyID0gbGlzdChsb24gPSAxMy4zNzgzLCBsYXQgPSA1Mi41MTYzKSwgem9vbSA9IDEwKSkgJT4lDQogIGFkZF9tYXJrZXJzKHggPSB+TG9uZ2l0dWRlLCB5ID0gfkxhdGl0dWRlLCANCiAgICAgICAgICAgICAgdGV4dCA9IH5zdHJfYyhOYW1lLCAiLCBFVVIgIiwgUHJpY2UsIHNlcCA9ICIiKSwgaG92ZXJpbmZvID0gInRleHQiLA0KICAgICAgICAgICAgICBzaXplID0gMjAsIGNvbG9yID0gSSgicmVkIikpICU+JSANCiAgaGlnaGxpZ2h0KG9uID0gInBsb3RseV9zZWxlY3RlZCIpDQoNCm1hcA0KYGBgDQpgYGB7cn0NCmFpcmJuYl9kYXRhICU+JQ0KICBmaWx0ZXIoUHJpY2UgPiAxMCkgJT4lDQogIHBsb3RfbWFwYm94KCkgJT4lDQogIGxheW91dChtYXBib3ggPSBsaXN0KHN0eWxlID0gIm9wZW4tc3RyZWV0LW1hcCIsIGNlbnRlciA9IGxpc3QobG9uID0gMTMuMzc4MywgbGF0ID0gNTIuNTE2MyksIHpvb20gPSAxMCkpICU+JQ0KICBhZGRfbWFya2Vycyh4ID0gfkxvbmdpdHVkZSwgeSA9IH5MYXRpdHVkZSwgDQogICAgICAgICAgICAgIHRleHQgPSB+c3RyX2MoTmFtZSwgIiwgRVVSICIsIFByaWNlLCBzZXAgPSAiIiksIGhvdmVyaW5mbyA9ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgc2l6ZSA9IDIwLCBjb2xvciA9IH5OZWlnaGJvdXJob29kLkdyb3VwLkNsZWFuc2VkKSAlPiUgDQogIGhpZ2hsaWdodChvbiA9ICJwbG90bHlfc2VsZWN0ZWQiKQ0KYGBgDQpgYGB7cn0NCkRUOjpkYXRhdGFibGUoDQogIGhlYWQoYWlyYm5iX2RhdGEgJT4lIHNlbGVjdCgiSUQiLCAiTmFtZSIsICJQcmljZSIpLCBuID0gNjApLCANCiAgZmlsdGVyID0gInRvcCIsDQogIHNlbGVjdGlvbiA9ICJzaW5nbGUiDQogICkNCmBgYA0KDQpgYGB7cn0NCmdyb3VwZWRfYWlyYm5iIDwtIGFpcmJuYl9kYXRhICU+JQ0KICAgICAgZ3JvdXBfYnkoTmVpZ2hib3VyaG9vZC5Hcm91cC5DbGVhbnNlZCkgJT4lDQogICAgICBzdW1tYXJpemUoDQogICAgICAgIE1lYW4uUHJpY2UgPSBtZWFuKFByaWNlLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICBNZWFuLlJldmlldy5TY29yZXMuUmF0aW5nID0gbWVhbihSZXZpZXcuU2NvcmVzLlJhdGluZywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgTWVhbi5Ib3N0LlJlc3BvbnNlLlJhdGUgPSBtZWFuKEhvc3QuUmVzcG9uc2UuUmF0ZSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgTWVhbi5BY2NvbW9kYXRlcyA9IG1lYW4oQWNjb21tb2RhdGVzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICBNZWFuLkJhdGhyb29tcyA9IG1lYW4oQmF0aHJvb21zLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICBNZWFuLkJlZHJvb21zID0gbWVhbihCZWRyb29tcywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgTWVhbi5CZWRzID0gbWVhbihCZWRzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICBOdW1iZXIub2YuTGlzdGluZ3MgPSBuKCkNCiAgICAgICkNCmdyb3VwZWRfYWlyYm5iDQpgYGANCmBgYHtyfQ0KbGlicmFyeShyanNvbikNCmJlcmxpbiA8LSBmcm9tSlNPTihmaWxlID0gImJlcmxpbl9iZXppcmtlLmdlb2pzb24iKQ0KYGBgDQoNCmBgYHtyfQ0KZ3JvdXBlZF9haXJibmJfaG9zdCA8LSBhaXJibmJfZGF0YSAlPiUNCiAgZ3JvdXBfYnkoSG9zdC5JRCkgJT4lDQogIHN1bW1hcml6ZSgNCiAgICBOdW1iZXIub2YuTGlzdGluZ3MgPSBuKCksDQogICAgTWVhbi5QcmljZSA9IG1lYW4oUHJpY2UsIG5hLnJtID0gVFJVRSksDQogICAgTWVhbi5SZXZpZXcuU2NvcmVzLlJhdGluZyA9IG1lYW4oUmV2aWV3LlNjb3Jlcy5SYXRpbmcsIG5hLnJtID0gVFJVRSksDQogICAgTWVhbi5SZXZpZXcuU2NvcmVzLkFjY3VyYWN5ID0gbWVhbihSZXZpZXcuU2NvcmVzLkFjY3VyYWN5LCBuYS5ybSA9IFRSVUUpLA0KICAgIE1lYW4uUmV2aWV3LlNjb3Jlcy5DbGVhbmxpbmVzcyA9IG1lYW4oUmV2aWV3LlNjb3Jlcy5DbGVhbmxpbmVzcywgbmEucm0gPSBUUlVFKSwNCiAgICBNZWFuLlJldmlldy5TY29yZXMuQ2hlY2tpbiA9IG1lYW4oUmV2aWV3LlNjb3Jlcy5DaGVja2luLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1lYW4uUmV2aWV3LlNjb3Jlcy5Db21tdW5pY2F0aW9uID0gbWVhbihSZXZpZXcuU2NvcmVzLkNvbW11bmljYXRpb24sIG5hLnJtID0gVFJVRSksDQogICAgTWVhbi5SZXZpZXcuU2NvcmVzLkxvY2F0aW9uID0gbWVhbihSZXZpZXcuU2NvcmVzLkxvY2F0aW9uLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1lYW4uUmV2aWV3LlNjb3Jlcy5WYWx1ZSA9IG1lYW4oUmV2aWV3LlNjb3Jlcy5WYWx1ZSwgbmEucm0gPSBUUlVFKSwNCiAgICBNZWFuLk51bWJlci5vZi5SZXZpZXdzID0gbWVhbihOdW1iZXIub2YuUmV2aWV3cywgbmEucm0gPSBUUlVFKSwNCiAgICBIb3N0Lk5hbWUgPSBIb3N0Lk5hbWUsIA0KICAgIEhvc3QuU2luY2UgPSBIb3N0LlNpbmNlLA0KICAgIEhvc3QuUmVzcG9uc2UuUmF0ZSA9IEhvc3QuUmVzcG9uc2UuUmF0ZSwNCiAgICBIb3N0LlJlc3BvbnNlLlRpbWUgPSBIb3N0LlJlc3BvbnNlLlRpbWUsDQogICAgSG9zdC5BY2NlcHRhbmNlLlJhdGUgPSBIb3N0LkFjY2VwdGFuY2UuUmF0ZQ0KICApIA0KRFQ6OmRhdGF0YWJsZShncm91cGVkX2FpcmJuYl9ob3N0KQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeSh2aXJpZGlzKSANCmBgYA0KDQoNCg0KDQoNCg==